home *** CD-ROM | disk | FTP | other *** search
/ Magnum One / Magnum One (Mid-American Digital) (Disc Manufacturing).iso / d12 / v10n07.arc / PALETTE.ARC / PIPES.ARC / PIPES.C < prev    next >
C/C++ Source or Header  |  1991-03-27  |  8KB  |  244 lines

  1. /*----------------------------------------------------------------
  2.    PIPES.C -- Palette Animation Using Windows 3.0 Palette Manager
  3.               (c) Charles Petzold, 1990
  4.   ----------------------------------------------------------------*/
  5.  
  6. #include <windows.h>
  7.  
  8. long FAR PASCAL WndProc (HWND, WORD, WORD, LONG) ;
  9.  
  10. #define ID_TIMER    1
  11.  
  12. int PASCAL WinMain (HANDLE hInstance, HANDLE hPrevInstance,
  13.                     LPSTR lpszCmdLine, int nCmdShow)
  14.      {
  15.      char     szAppName [] = "Pipes" ;
  16.      HWND     hwnd ;
  17.      MSG      msg ;
  18.      WNDCLASS wndclass ;
  19.  
  20.      if (!hPrevInstance) 
  21.           {
  22.           wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
  23.           wndclass.lpfnWndProc   = WndProc ;
  24.           wndclass.cbClsExtra    = 0 ;
  25.           wndclass.cbWndExtra    = 0 ;
  26.           wndclass.hInstance     = hInstance ;
  27.           wndclass.hIcon         = NULL ;
  28.           wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
  29.           wndclass.hbrBackground = GetStockObject (WHITE_BRUSH) ;
  30.           wndclass.lpszMenuName  = szAppName ;
  31.           wndclass.lpszClassName = szAppName ;
  32.  
  33.           RegisterClass (&wndclass) ;
  34.           }
  35.  
  36.      hwnd = CreateWindow (szAppName, "Pipes: Palette Animation",
  37.                           WS_OVERLAPPEDWINDOW,
  38.                           CW_USEDEFAULT, CW_USEDEFAULT,
  39.                           CW_USEDEFAULT, CW_USEDEFAULT,
  40.                           NULL, NULL, hInstance, NULL) ;
  41.  
  42.      ShowWindow (hwnd, nCmdShow) ;
  43.      UpdateWindow (hwnd) ;
  44.  
  45.      while (GetMessage (&msg, NULL, 0, 0))
  46.           {
  47.           TranslateMessage (&msg) ;
  48.           DispatchMessage (&msg) ;
  49.           }
  50.  
  51.      return msg.wParam ;
  52.      }
  53.  
  54. long FAR PASCAL WndProc (HWND hwnd, WORD message, WORD wParam, LONG lParam)
  55.      {
  56.      static BOOL        bLeftToRight = TRUE ;
  57.      static HPALETTE    hPal ;
  58.      static LOCALHANDLE hLocalMem ;
  59.      static LOGPALETTE  *plp ;
  60.      static short       cxClient, cyClient, iIndex = 0 ;
  61.      BOOL               bPalSupport ;
  62.      HBRUSH             hBrush ;
  63.      HDC                hdc ;
  64.      int                x1, x2, y1, y2 ;
  65.      long               i ;
  66.      PAINTSTRUCT        ps ;
  67.      RECT               rc ;
  68.  
  69.      switch (message)
  70.           {
  71.           case WM_CREATE:
  72.  
  73.                     // Check for palette support
  74.  
  75.                hdc = GetDC (hwnd) ;
  76.  
  77.                bPalSupport = (RC_PALETTE & GetDeviceCaps (hdc, RASTERCAPS)) &&
  78.                              (GetDeviceCaps (hdc, SIZEPALETTE) -
  79.                               GetDeviceCaps (hdc, NUMRESERVED) > 16) ;
  80.  
  81.                ReleaseDC (hwnd, hdc) ;
  82.  
  83.                if (!bPalSupport)
  84.                     {
  85.                     MessageBox (hwnd, "Program requires palette support",
  86.                                 "Bounce", MB_ICONEXCLAMATION | MB_OK) ;
  87.  
  88.                     DestroyWindow (hwnd) ;
  89.                     return 0 ;
  90.                     }
  91.  
  92.                     // Allocate memory for LOGPALETTE structure and lock it
  93.  
  94.                hLocalMem = LocalAlloc (LMEM_MOVEABLE, sizeof (LOGPALETTE) +
  95.                                                  32 * sizeof (PALETTEENTRY)) ;
  96.  
  97.                plp = (LOGPALETTE *) LocalLock (hLocalMem) ;
  98.  
  99.                     // Initialize the fields of the LOGPALETTE structure
  100.  
  101.                plp->palVersion    = 0x300 ;
  102.                plp->palNumEntries = 16 ;
  103.  
  104.                for (i = 0 ; i <= 8 ; i++)
  105.                     {
  106.                     plp->palPalEntry[i].peRed   = min (255, 0x20 * i) ;
  107.                     plp->palPalEntry[i].peGreen = 0 ;
  108.                     plp->palPalEntry[i].peBlue  = min (255, 0x20 * i) ;
  109.                     plp->palPalEntry[i].peFlags = PC_RESERVED ;
  110.  
  111.                     plp->palPalEntry[16 - i] = plp->palPalEntry[i] ;
  112.                     plp->palPalEntry[16 + i] = plp->palPalEntry[i] ;
  113.                     plp->palPalEntry[32 - i] = plp->palPalEntry[i] ;
  114.                     }
  115.  
  116.                     // Create the logical palette & unlock the memory block
  117.  
  118.                hPal = CreatePalette (plp) ;
  119.                LocalUnlock (hLocalMem) ;
  120.  
  121.                     // Set the timer for 100 msec
  122.  
  123.                SetTimer (hwnd, ID_TIMER, 100, NULL) ;
  124.                return 0 ;
  125.  
  126.           case WM_SIZE:
  127.                cxClient = LOWORD (lParam) ;
  128.                cyClient = HIWORD (lParam) ;
  129.                return 0 ;
  130.  
  131.           case WM_TIMER:
  132.                plp = (LOGPALETTE *) LocalLock (hLocalMem) ;
  133.  
  134.                     // Animate the palette
  135.  
  136.                AnimatePalette (hPal, 0, 16, plp->palPalEntry + iIndex) ;
  137.  
  138.                     // Increment the index
  139.  
  140.                iIndex = (iIndex + 1) % 16 ;
  141.  
  142.                LocalUnlock (hLocalMem) ;
  143.                return 0 ;
  144.  
  145.           case WM_PAINT:
  146.                hdc = BeginPaint (hwnd, &ps) ;
  147.  
  148.                SelectPalette (hdc, hPal, FALSE) ;
  149.                RealizePalette (hdc) ;
  150.  
  151.                     // Draw window background
  152.  
  153.                GetWindowRect (hwnd, &rc) ;
  154.                hBrush = SelectObject (hdc, GetStockObject (WHITE_BRUSH)) ;
  155.                FillRect (hdc, &rc, hBrush) ;
  156.  
  157.                     // Draw the interiors of the pipes
  158.  
  159.                for (i = 0 ; i < 128 ; i++)
  160.                     {
  161.                     hBrush = CreateSolidBrush (PALETTEINDEX (i % 16)) ;
  162.                     SelectObject (hdc, hBrush) ;
  163.  
  164.                     rc.left   = (127 - i) * cxClient / 128 ;
  165.                     rc.right  = (128 - i) * cxClient / 128 ;
  166.  
  167.                     rc.top    =  4 * cyClient / 14 ;
  168.                     rc.bottom =  5 * cyClient / 14 ;
  169.  
  170.                     FillRect (hdc, &rc, hBrush) ;
  171.  
  172.                     rc.left   =  i      * cxClient / 128 ;
  173.                     rc.right  = (i + 1) * cxClient / 128 ;
  174.  
  175.                     rc.top    =  9 * cyClient / 14 ;
  176.                     rc.bottom = 10 * cyClient / 14 ;
  177.  
  178.                     FillRect (hdc, &rc, hBrush) ;
  179.  
  180.                     DeleteObject (SelectObject (hdc,
  181.                                   GetStockObject (BLACK_BRUSH))) ;
  182.                     }
  183.  
  184.                     // Draw the edges of the pipes
  185.  
  186.                MoveTo (hdc, 0,         4 * cyClient / 14) ;
  187.                LineTo (hdc, cxClient,  4 * cyClient / 14) ;
  188.  
  189.                MoveTo (hdc, 0,         5 * cyClient / 14) ;
  190.                LineTo (hdc, cxClient,  5 * cyClient / 14) ;
  191.  
  192.                MoveTo (hdc, 0,         9 * cyClient / 14) ;
  193.                LineTo (hdc, cxClient,  9 * cyClient / 14) ;
  194.  
  195.                MoveTo (hdc, 0,        10 * cyClient / 14) ;
  196.                LineTo (hdc, cxClient, 10 * cyClient / 14) ;
  197.  
  198.                EndPaint (hwnd, &ps) ;
  199.                return 0 ;
  200.  
  201.           case WM_QUERYNEWPALETTE:
  202.                hdc = GetDC (hwnd) ;
  203.  
  204.                SelectPalette (hdc, hPal, FALSE) ;
  205.  
  206.                if (RealizePalette (hdc) > 0)
  207.                     {
  208.                     ReleaseDC (hwnd, hdc) ;
  209.                     InvalidateRect (hwnd, NULL, FALSE) ;
  210.                     return TRUE ;
  211.                     }
  212.                else
  213.                     {
  214.                     ReleaseDC (hwnd, hdc) ;
  215.                     return FALSE ;
  216.                     }
  217.                break ;
  218.  
  219.           case WM_PALETTECHANGED:
  220.                if (wParam != hwnd)
  221.                     {
  222.                     hdc = GetDC (hwnd) ;
  223.  
  224.                     SelectPalette (hdc, hPal, FALSE) ;
  225.  
  226.                     if (RealizePalette (hdc) > 0)
  227.                          {
  228.                          InvalidateRect (hwnd, NULL, FALSE) ;
  229.                          }
  230.  
  231.                     ReleaseDC (hwnd, hdc) ;
  232.                     }
  233.                return 0 ;
  234.  
  235.           case WM_DESTROY :
  236.                KillTimer (hwnd, ID_TIMER) ;
  237.                LocalFree (hLocalMem) ;
  238.                DeleteObject (hPal) ;
  239.                PostQuitMessage (0) ;
  240.                return 0 ;
  241.           }
  242.      return DefWindowProc (hwnd, message, wParam, lParam) ;
  243.      }
  244.